package com.dingreading.cloud.admin.service;

import com.dingreading.cloud.admin.dto.ShopCartDto;
import com.dingreading.cloud.admin.dto.ShopCartSendDto;
import com.dingreading.cloud.admin.dto.ShopCartStatDto;
import com.dingreading.cloud.admin.entity.ShopCart;
import com.dingreading.cloud.common.util.PageUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 服务层。
 *
 * @author Administrator
 * @since 2023-11-22
 */
public interface ShopCartService extends IService<ShopCart> {

    Page<ShopCartSendDto> outPageListV2(PageUtil pageUtil, String keyword, Integer stockOutMethod, Integer status);

    int deleteByStaffIdAndCode(String staffUid, String code);

    List<ShopCart> getByCode(String staffUid, String code);

    List<ShopCart> getByCodes(String staffUid, List<String> code);

    // 获取员工购物车商品总数量
    long getStaffShopCartCount(String storeUid, String staffUid, int type);

    boolean cancelShopCarts(String staffUid, String code);

    // 根据商品id取消购物车内的商品记录
    void cancelShopCartByGoodsId(Long goodsId);

    // 根据组合商品类型和商品规格id取消购物车内的商品记录
    void cancelShopCartByGoodsTypeId(Integer mainComboType, Long goodsTypeId);

    void confirmShopCart(String code);

    boolean resumeShopCarts(String code, Integer status, String statusName);

    // 获取待出库的记录数量
    long getWaitOutCnt(String code);

    ShopCart getByCodeAndId(String code, Long id);

    boolean updateOutRemark(String code, Long id, String outRemark);

    // 实体购物车商品出库完成
    boolean setOutOk(String code);

    // 非实体购物车商品出库完成
    boolean setOutOk(String code, Long id, String outRemark);

    // 撤回订单付款
    boolean revocationPayed(String code);

    boolean revocationGiftShopCarts(String code, String staffUid, String staffName);

    // 赠品购物车记录数量
    boolean haveGiftGoodsType(String storeUid, Long goodsId, Long goodsTypeId);

    // 赠品购物车记录
    List<ShopCart> giftMainListByStoreUidAndStaffUid(String storeUid, String staffUid);

    List<ShopCart> giftMainRelationListByStoreUidAndStaffUid(String storeUid, String staffUid);

    boolean getByTypeAndGoodsTypeId(int type, Long goodsTypeId);

    /*----------V3-------------*/
    // 判断是否有商品id
    boolean haveGoodsId(Long goodsId);

    // 判断是否有商品规格id
    boolean haveGoodsTypeId(Long goodsTypeId);


    // 删除购物车记录和子购物车记录
    long dropByStoreUidAndId(String storeUid, Long id, String shopCartUid);


    // 获取正常商品和组合商品的自购物车记录
    List<ShopCart> mainListAndChildListByCode(String code);


    // 获取订单号为null的组合子购物车记录
    List<ShopCart> childListByStoreUidAndStaffUidAndUidsAndCodeIsNull(String storeUid, String staffUid, List<String> mainShopCartUids);

    // 获取正常商品和组合子商品，排除组合商品
    List<ShopCartDto> listByCodeAndComboType(String code, Integer comboType);

    // 购物车和组合子购物车更新订单编号
    void updateFormInfo(List<String> shopCartUids, String code);

    // 获取订单的可发货商品
    List<ShopCartSendDto> listToExpress(List<String> codes, Integer stockOutMethod);

    // 根据购买记录和出库记录获取商品规格的待出库数量
    int getWaitSendNum(Long goodsTypeId);

    // 根据购买记录和出库记录获取商品规格的待出库数量集合
    Map<Long, Integer> getWaitSendNum(List<Long> goodsTypeIds);

    // 获取商品的售出数量
    Map<Long, Integer> getSoldNum(List<Long> goodsTypeIds, Integer storeType);


    void updateUnitPrice(Long goodsTypeId, Double uPrice);

    // 获取已售记录
    List<ShopCart> saleListByGoodsTypeIdIn(List<Long> goodsTypeIds);


    // 获取要进行数据补充的记录
    List<ShopCart> makeupList(List<String> codeList);

    List<ShopCartStatDto> storeBuyGoodsStat(String beginDate, String endDate);

    List<ShopCart> listByDiscountPriceIsNUll();

    void updateDiscountPrice(Long id, double discountPrice);
}
